package com.djzhou.gmms.dao.base;

import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.springframework.dao.DataAccessException;

import com.djzhou.gmms.model.entity.Entity;
import com.djzhou.gmms.model.entity.PageBean;


/**
 * 基类DAO接口
 * @author djzhou
 *
 * @param <T>
 */
public interface BaseDAO<T extends Entity> {
	/**
	 * 插入新数据
	 * @param 实体对象
	 * @throws DataAccessException
	 */
	void insert(T t);
	/**
	 * 若ID不为空则修改数据,若ID为空则添加数据
	 * @param t
	 * @throws DataAccessException
	 *
	 */
	void merge(T t);
	/**
	 * 修改数据
	 * @param 实体对象
	 * @throws DataAccessException
	 */
	void update(T t);
	/**
	 * 通过HQL语句更新(谨慎使用，此更新不能达到级联更新)
	 * @param hql
	 * @param params
	 */
	int update(String hql,Object... params) throws DataAccessException;
	/**
	 * 通过HQL语句更新(此发放使用CurrentSession)
	 * @param hql
	 * @param params
	 */
	int updateForSpring(String hql,Object... params) throws DataAccessException;
	/**
	 * 通过HQL查找数据
	 * @param hql
	 * @param params
	 */
	List<T> query(String hql,Object... params);
	/**
	 * 通过对象删除数据
	 * @param 实体对象
	 * @throws Exception
	 */
	void delete(T t);
	/**
	 * 批量删除数据（谨慎使用，此方法不能级联删除）
	 * @param hql
	 * @param params
	 * @throws DataAccessException
	 */
	int delete(String hql,Object... params) throws DataAccessException;
	/**
	 * 通过ID删除
	 * @param id
	 */
	void delete(Class<T> entityClass,Integer id);
	/**
	 * 通过ID删除
	 * @param id
	 */
	void delete(Class<T> entityClass,String id);
	/**
	 * 通过ID查询
	 * @param id
	 * @return
	 */
	T queryByID(Class<T> entityClass,String id);
	/**
	 * 通过ID查询
	 * @param id
	 * @return
	 */
	T queryByID(Class<T> entityClass,Integer id);
	/**
	 * 通过ID判断一个对象在数据库中是否存在
	 * @param id
	 * @return
	 */
	Boolean isEmpty(Class<T> entityClass,Integer id);
	/**
	 * 通过ID判断一个对象在数据库中是否存在
	 * @param id
	 * @return
	 */
	Boolean isEmpty(Class<T> entityClass,String id);
	/**
	 * 通过用户传入的语句来判断数据库中是否存在该对象
	 * @param id
	 * @return
	 */
	Boolean isEmpty(String hql,Object... params);
	/**
	 * 返回sql记录数
	 * @param sql
	 * @param params
	 * @return
	 *
	 */
	int execSqlQuery(String sql,Object... params);
	/**
	 * 
	 * 执行SQL语句不反回值
	 * @param sql
	 * @param params
	 *
	 */
	void execSql(String sql,Object... params);
	
	/**
	 * 
	 * 根据当前页码和每页的记录数获取记录列表
	 * selectByPage
	 * TODO 适用条件:
	 * TODO 执行流程:
	 * TODO 使用方法:
	 * TODO 注意事项:
	 * @param name pageSize 每页记录数 
	 * @param name currentPage 当前第几页 
	 * @Exception
	 * @since Ver1.0
	 */
	PageBean<T> selectByPage(final String hql,int pageSize,int currentPage);
	/**
	 * 这个方法不太实用,可以使用另一个重载方法,hql语句从service传
	 * 根据当前页码和每页的记录数获取记录列表
	 * selectByPage
	 * TODO 适用条件:
	 * TODO 执行流程:
	 * TODO 使用方法:
	 * TODO 注意事项:
	 * @param name filterMap 查询条件Map
	 * @param name pageSize 每页记录数 
	 * @param name currentPage 当前第几页 
	 * @Exception
	 * @since Ver1.0
	 */
	PageBean<T> selectByPage(final String hql,Map<String,Object> filterMap,int pageSize,int currentPage);
	/**
	 * 
	 * @description:  通过SQL语句返回集合
	 * @param 返回集合体类型
	 * @param sql sql语句
	 * @param pageSize 
	 * @param currentPage
	 * @param params
	 * @return
	 *
	 */
	List<T> searchSql(final Class<T> c,final String sql,final int firstResult,int maxResult,Object... params);
	/**
	 * 
	 * 执行SQL语句
	 * @param <E>
	 * @param c 返回集合对象类型
	 * @param fristResult 开始记录数 从1开始
	 * @param pageSize 每页显示多少条
	 * @param sql 要执行的SQL语句
	 * @param params 传递的参数
	 * @return 返回查找后的集合
	 * @throws Exception 抛出异常
	 *
	 */
	<E> List<E> executeSelect(Class<E> c,int fristResult,int pageSize,String sql,Object...params) throws Exception;
	/**
	 * 
	 * 获取查询hibernate对象
	 * @return 返回查找后的集合
	 * @throws Exception 抛出异常
	 *
	 */
	Query getQuery(String hql) throws Exception;
	/**
	 * 
	 * 获取查询总记录数
	 * @return 返回查找后总记录数
	 * @throws Exception 抛出异常
	 *
	 */
	int getCount(String hql,Object ... values) throws Exception;
	/**
	 * 执行sql返回一个单元格
	 * @param sql
	 * @param column
	 * @return
	 * @throws Exception
	 */
	Object searchSql(String sql,String column) throws Exception;
	
	
}
